//
// CDXGraph.h
//

#ifndef __H_CDXGraph__
#define __H_CDXGraph__

// Filter graph notification to the specified window


#include <string>
#include <string.h>
#include <atlstr.h>
#include <vector>
using namespace std;

#define WM_GRAPHNOTIFY  (WM_USER+20)

typedef HRESULT (CALLBACK *FUNC_DllGetClassObject)(REFCLSID,REFCLSID,void**);
typedef struct _Filter_Info_{
	wstring filePath;
	HINSTANCE hInstance;
	FUNC_DllGetClassObject DllGetClassObject;
}Filter_Info;




class CDXGraph
{
private:
	IGraphBuilder *     mGraph;  
	IMediaControl *		mMediaControl;
	IMediaEventEx *		mEvent;
	IBasicVideo *		mBasicVideo;
	IBasicAudio *		mBasicAudio;
	IVideoWindow  *		mVideoWindow;
	IMediaSeeking *		mSeeking;

	DWORD				mObjectTableEntry; 
	//moon++
	vector<Filter_Info>  ExtendFilter;
	void AddFilterByCLSIDStr(wstring szFileDll, LPWSTR clsidStr,wstring pName);
	bool RegisterCOM(bool bRegister, const TCHAR* ptcComDllPath = NULL);
	bool RegisterCOM1(wstring szFileDLL,bool bRegister=true);
	//moon--

public:
	CDXGraph();
	virtual ~CDXGraph();

public:
	virtual bool Create(void);
	virtual void Release(void);
	virtual bool Attach(IGraphBuilder * inGraphBuilder);


	IGraphBuilder * GetGraph(void); // Not outstanding reference count
	IMediaEventEx * GetEventHandle(void);

	bool ConnectFilters(IPin * inOutputPin, IPin * inInputPin, const AM_MEDIA_TYPE * inMediaType = 0);
	void DisconnectFilters(IPin * inOutputPin);

	bool SetDisplayWindow(HWND inWindow);
	bool SetNotifyWindow(HWND inWindow);
	bool ResizeVideoWindow(long inLeft, long inTop, long inWidth, long inHeight);
	void HandleEvent(WPARAM inWParam, LPARAM inLParam);

	bool Run(void);        // Control filter graph
	bool Stop(void);
	bool Pause(void);
	bool IsRunning(void);  // Filter graph status
	bool IsStopped(void);
	bool IsPaused(void);

	bool SetFullScreen(BOOL inEnabled);
	bool GetFullScreen(void);

	// IMediaSeeking
	bool GetCurrentPosition(double * outPosition);
	bool GetStopPosition(double * outPosition);
	bool SetCurrentPosition(double inPosition);
	bool SetStartStopPosition(double inStart, double inStop);
	bool GetDuration(double * outDuration);
	bool SetPlaybackRate(double inRate);

	//Attention: range from -10000 to 0, and 0 is FULL_VOLUME.
	bool SetAudioVolume(long inVolume);
	long GetAudioVolume(void);
	//Attention: range from -10000(left) to 10000(right), and 0 is both.
	bool SetAudioBalance(long inBalance);
	long GetAudioBalance(void);

	bool RenderFile(LPCTSTR pszInFile);
	bool SnapshotBitmap(LPCTSTR pszOutFile);

private:
	void AddToObjectTable(void) ;
	void RemoveFromObjectTable(void);

	bool QueryInterfaces(void);
};

#endif // __H_CDXGraph__